home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 June (DVD) / DPPRO0605DVD.iso / Install / program files / Borland / BDS / 3.0 / Demos / Delphi.Net / CLR / AppDomainLoader / LoadAsmImpl.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-10-22  |  2.8 KB  |  112 lines

  1. unit LoadAsmImpl;
  2.  
  3. interface
  4.   uses System.Reflection;
  5.  
  6. type
  7.   TAssemblyLoaderHelper = class(MarshalByRefObject)
  8.   private
  9.     FLoadedAssembly: Assembly;
  10.   public
  11.     constructor Create;
  12.     procedure Load(AssemblyName: string);
  13.     procedure Invoke(AClassName: string; AMethodName: string);
  14.     procedure InvokeGlobal(AMethodName: string); overload;
  15.   end;
  16.  
  17.   TAssemblyLoader = class
  18.   strict private
  19.     FAppDomain: AppDomain;
  20.     FAssemblyLoaderHelper: TAssemblyLoaderHelper;
  21.   public
  22.     constructor Create;
  23.     destructor Destroy; override;
  24.     procedure LoadAssembly(AssemblyName: string);
  25.     procedure Invoke(AClassName, AMethodName: string);
  26.   end;
  27.  
  28. implementation
  29.   uses System.IO;
  30.  
  31. constructor TAssemblyLoaderHelper.Create;
  32. begin
  33.   inherited Create;
  34.   FLoadedAssembly := nil;
  35. end;
  36.  
  37. procedure TAssemblyLoaderHelper.Invoke(AClassName, AMethodName: string);
  38. var
  39.   AClass: &Type;
  40. begin
  41.   AClass := FLoadedAssembly.GetType(AClassName);
  42.   if Assigned(AClass) then
  43.     AClass.InvokeMember(AMethodName, BindingFlags.InvokeMethod, nil, nil, []);
  44. end;
  45.  
  46. procedure TAssemblyLoaderHelper.InvokeGlobal(AMethodName: string);
  47. var
  48.  ATypes: array of &Type;
  49.  Assm: Assembly;
  50.  I: Integer;
  51. begin
  52.  Assm := Assembly.Load('testpkg');
  53.  ATypes := Assm.GetExportedTypes;
  54. // Modules := Assm.GetModules(False);
  55.  for I := Low(ATypes) to High(ATypes) do
  56.   if ATypes[I].ToString.EndsWith('Unit') then
  57. end;
  58.  
  59. procedure TAssemblyLoaderHelper.Load(AssemblyName: string);
  60. begin
  61.   FLoadedAssembly := Assembly.Load(AssemblyName);
  62. end;
  63.  
  64. { TAssemblyLoader }
  65.  
  66. constructor TAssemblyLoader.Create;
  67. begin
  68.   inherited Create;
  69. end;
  70.  
  71. destructor TAssemblyLoader.Destroy;
  72. begin
  73.   FAssemblyLoaderHelper := nil;
  74.   if Assigned(FAppDomain) then
  75.     AppDomain.Unload(FAppDomain);
  76.   FAppDomain := nil;
  77.   inherited;
  78. end;
  79.  
  80. /// Invokes a method from the specified class in the assembly
  81. procedure TAssemblyLoader.Invoke(AClassName, AMethodName: string);
  82. begin
  83.   FAssemblyLoaderHelper.Invoke(AClassName, AMethodName);
  84. end;
  85.  
  86. procedure TAssemblyLoader.LoadAssembly;
  87. var
  88.   fi: FileInfo;
  89.   setup: AppDomainSetup;
  90.   BaseDir, AsmName: string;
  91. begin
  92.   fi := FileInfo.Create(AssemblyName);
  93.   setup := AppDomainSetup.Create;
  94.   BaseDir := fi.DirectoryName;
  95.   setup.ApplicationBase := BaseDir;
  96.   setup.PrivateBinPath := '.';
  97.   setup.ApplicationName := 'Loader';
  98.   setup.ShadowCopyFiles := 'true';
  99.   setup.ShadowCopyDirectories := setup.ApplicationBase+';'+fi.DirectoryName;
  100.  
  101.   FAppDomain := AppDomain.CreateDomain('Loading Domain', nil, setup);
  102.  
  103.   FAssemblyLoaderHelper := TAssemblyLoaderHelper
  104.    (FAppDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly.Location,
  105.     'LoadAsmImpl.TAssemblyLoaderHelper'));
  106.  
  107.   AsmName := fi.Name.Replace(fi.Extension, '');
  108.   FAssemblyLoaderHelper.Load(AsmName);
  109. end;
  110.  
  111. end.
  112.